import {ArkPagination} from "../../common-type/ark-pagination";

/** 选择模式 */
export enum SelectMode {
  NONE = "none",
  SINGLE_ROW = "single",
  MULTIPLE_ROWS = "multiple",
  MULTIPLE_CHECKBOX_ROWS = "multiple checkbox",
  SINGLE_CELL = "cell",
  MULTIPLE_CELLS = "multicell",
}

/** 对齐方式 */
export enum Align {
  LEFT = "left",
  CENTER = "center",
  RIGHT = "right",
}

/** 列定义 */
export interface Column {
  /** 是否显示 */
  show?: boolean;
  /** 列文案 */
  label?: string;
  /** 列属性 */
  prop: string;
  /** 列宽度 */
  width?: any;
  /** 对齐方式 */
  align?: Align;
  /** 列组件v-bind指令参数 */
  attributes?: Record<string, any>;
  /** 列组件v-on指令参数 */
  events?: Record<string, any>;
}

/** 分页响应数据 */
export interface PaginationData<T> {
  /** 总条数 */
  total: number;
  /** 每页条数 */
  pageSize: number;
  /** 表格数据 */
  rows: T[];
}

export interface ArkTableOptions<T> {
  /** 是否显示行号列 */
  rowNumber?: boolean;
  /** 行号以页开始 */
  rowNumberPageStart?: boolean;

  /** 选择模式 */
  selectMode?: SelectMode;
  /** 选择的数据 */
  selectData?: T[];

  /** 是否斑马纹 */
  stripe?: boolean;
  /** 加载时显示的文案 */
  loadingText?: string;

  /** 列定义 */
  columns?: Column[];
  /** 表格数据 */
  data?: T[];
  /**
   * 分页数据
   *
   * 组件会根据实际情况填充它
   * */
  pagination?: ArkPagination;

  /** fetchData方法的参数 */
  fetchDataParams?: any;

  /**
   * 定义数据抓取行为
   *
   * 当表格数据为动态或异步时可以使用，返回值将被组件内部处理填充 data 属性
   * */
  defineDataFetch?:
      | ((params: any) => any[])
      | ((params: any) => PaginationData<any>)
      | ((params: any) => Promise<PaginationData<any> | any[]>);

  /**
   * 手动抓取数据。默认值为false
   * - 值为false，组件在初始化时会调用 defineDataFetch
   * - 值为true，组件在初始化时不会调用 defineDataFetch。需手动调用 fetchData 方法抓取数据
   * */
  manualFetchData?: boolean;

  /** 表格组件v-bind指令参数 */
  attributes?: Record<string, any>;
  /** 表格组件v-on指令参数 */
  events?: Record<string, any>;
}

/** options默认值 */
const arkTableOptionsDefault: Partial<ArkTableOptions<any>> = {
  rowNumber: false,
  rowNumberPageStart: false,
  selectMode: SelectMode.NONE,
  selectData: [],
  stripe: true,
  loadingText: "加载中...",
  columns: [],
  data: [],
  fetchDataParams: {},
  manualFetchData: false,
  attributes: {
    emptyMsg: "暂无数据",
  },
  events: {},
};
export default arkTableOptionsDefault

/** 组件接口 */
export interface ArkTableExpose {
  /**
   * 抓取数据方法
   *
   * 适用于主动触发选项获取的场景。
   * */
  fetchData?: () => Promise<void>;
}